package base.util;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.XmlUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Locale;
import java.util.Random;
import java.util.ResourceBundle;
import java.util.concurrent.TimeUnit;

/**
 * 工具集: 可以用hutool工具 https://www.hutool.cn/
 */
public class Util {
    private static final Logger log = LoggerFactory.getLogger(Util.class);

    /**
     * 获取 obj 的字符串类型值，如果obj 为空，则返回 defValue
     * @param obj
     * @param defValue
     * @return
     */
    public static String  strByDefault(Object obj, String defValue) {
        if (isEmpty(obj)) {
            return defValue;
        }else{
            return String.valueOf(obj);
        }
    }

    public static boolean isEmpty(Object obj) {
        if (ObjectUtil.isNull(obj) || ObjectUtil.isEmpty(obj)) {
            return true;
        }else{
            return false;
        }
    }

    /**
     * 计算百分比规则：分子/分母 * 100
     * @param numerator 分子
     * @param denominator 分母
     * 如果出现异常返回：NULL
     */
    public static BigDecimal getPercent(Integer numerator, Integer denominator){
        BigDecimal a;
        BigDecimal b;
        try {
            a = new BigDecimal(numerator);
            b = new BigDecimal(denominator);
            BigDecimal divide = a.divide(b, 2, RoundingMode.UP);
            return new BigDecimal(divide.toBigInteger().intValue()*100);
        }catch (Exception e){
            log.info("统计百分比出现分母为空");
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 休眠指定秒钟，中途可被打断
     * @param seconds 秒钟
     */
    public static void sleepX(int seconds){
        try {
            TimeUnit.SECONDS.sleep(seconds);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 休眠指定毫秒钟
     * @param milliSeconds 毫秒钟
     */
    public static void sleepMilliX(int milliSeconds){
        try {
            TimeUnit.MILLISECONDS.sleep(milliSeconds);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     *
     * @param min 最小值
     * @param max 最大值
     * @return 返回一个介于 最小值~最大值 之间的随机整数
     * Random.nextInt(max) 返回 [0,max)
     */
    public static int randomInt(int min, int max){
        Random random = new Random();
        return random.nextInt(max) + min;
    }

    /**
     * 返回 properties 文件中的 key 对应的 value
     * @param sourceName  properties文件名
     * @param key  键
     * @return value 值
     */
    public static String getProperty(String sourceName, String key) {
        String value = "";
        try {
            Locale locale = Locale.getDefault();
            ResourceBundle resourceBundle = ResourceBundle.getBundle(sourceName, locale);
            value = resourceBundle.getString(key);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return value;
        }
    }

    /**
     * 从 doc 对象中获取所有 tagName 节点，取第 index 节点，并从这个节点中取得第一个Children的值
     * @param doc
     * @param index
     * @param tagName
     * @return
     *
     * 案例：xmlStr内容如下（就是纯xml内容）
     * <taxML>
     * 	<rtnCode>000</rtnCode>
     * 	<msg>成功</msg>
     * 	<nsrxxGrid>
     * 		<nsrxxGridlb>
     * 			<djxh>10213700000001101560</djxh>
     * 			<nsrsbh>91370105MABMT85P30</nsrsbh>
     * 			<nsrmc>济南林宇建材有限公司第一分公司</nsrmc>
     * 		</nsrxxGridlb>
     * 		<nsrxxGridlb>
     * 			<djxh>10213700000001101560</djxh>
     * 			<nsrsbh>91370105MABMT85P30</nsrsbh>
     * 			<nsrmc>济南林宇建材有限公司第一分公司</nsrmc>
     * 		</nsrxxGridlb>
     * 	</nsrxxGrid>
     * </taxML>
     *
     * Document doc = XmlUtil.parseXml(xmlStr);
     * String djxh = Util.getChildValue(doc, "djxh", 0);
     *
     */
    public static <T> T getChildValue(Document doc, String tagName, int index, T defaultValue){
        NodeList nodeList = doc.getElementsByTagName(tagName);
        return getChildValue(nodeList, index, defaultValue);
    }

    /**
     * 获取 nodeList 中第 index 个节点，并取该节点的第一个 Children 值
     * @param nodeList
     * @param index
     * @return
     */
    public static <T> T getChildValue(NodeList nodeList, int index, T defaultValue) {
        if(null==nodeList || nodeList.getLength()==0){
            return defaultValue;
        }

        Node node = nodeList.item(index).getFirstChild();
        if(null == node){
            return defaultValue;
        }else{
            String nodeValue = node.getNodeValue();
            return (T)nodeValue;
        }
    }


    /**
     * 获取 json 对象所有 tagName 节点，并将第 index 个位置节点的值返回
     * @param json  cn.hutool.json.JSONObject 对象
     * @param tagName 级联标签，比如：taxML.nsrxxGrid.nsrxxGridlb.djxh
     * @param index 结果的第几号位置元素值
     * @return
     *
     * 案例：jsonStr内容如下
     * {"taxML":
     *     {
     *         "rtnCode":"000",
     *         "msg":"成功",
     *         "nsrxxGrid":{
     *             "nsrxxGridlb":[
     *                 {
     *                     "djxh":"10213700000001101560",
     *                     "nsrsbh":"91370105MABMT85P30",
     *                     "nsrmc":"济南林宇建材有限公司第一分公司"
     *                 },
     *                 {
     *                     "djxh":"10213700000001101560",
     *                     "nsrsbh":"91370105MABMT85P30",
     *                     "nsrmc":"济南林宇建材有限公司第一分公司"
     *                 }
     *             ]
     *         }
     *     }
     * }
     *
     * JSONObject json = JSONUtil.parseObj(jsonStr);
     * String djxh = Util.getChildValue(json, "taxML.nsrxxGrid.nsrxxGridlb.djxh", 0, "0");
     */
    public static <T> T getChildValue(JSONObject json, String tagName, int index, T defaultValue){
        ArrayList<T> lists = JSONUtil.getByPath(json, tagName, new ArrayList<T>());

        if (index > lists.size() || index < 0) {
            return defaultValue;
        }

        return lists.get(index);
    }





}    

